home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / psion / pic2ps.c < prev    next >
C/C++ Source or Header  |  1993-12-02  |  4KB  |  161 lines

  1. /*
  2.  * Date: Thu, 2 Dec 93 10:48:36 -0800
  3.  * From: clive@biosym.com (Clive Freeman)
  4.  * Subject: A simple pic to postscript utility
  5.  * 
  6.  * 
  7.  * This is the source code to a simple 
  8.  * utility that I wrote to convert psion .pic files to postscript.
  9.  * 
  10.  */
  11.  
  12. /*---------------------------------------------------------------------*/
  13. /* Convert PSION s3a simple SCREEN.PIC to .ps,                         */
  14. /* December 1993, NB. unix box word assumed - L2BW,                    */
  15. /*---------------------------------------------------------------------*/
  16.  
  17. #include "stdio.h"
  18. #define TRUE  1
  19. #define FALSE 0
  20.  
  21. #define L2BW(A) ((A & 0xff00) >> 8)  | ((A & 0x00ff) << 8)
  22. #define L2BLW(A) ((L2BW(A & 0x0000ffff) ) << 16  |  L2BW((A & 0xffff0000 ) >> 16) ) 
  23.  
  24. main(argc,argv)
  25. int argc;
  26. char *argv[];
  27. {
  28.     struct p_fsig{ 
  29.         unsigned char id[4]; 
  30.         unsigned char file_ver; 
  31.         unsigned char app_ver; 
  32.         unsigned short count; 
  33.     } signature;
  34.       struct ws_pic_header {
  35.              unsigned short  crc; 
  36.              unsigned short     size[2];
  37.              unsigned short  byte_size;
  38.              unsigned int       offset; 
  39.       } header;
  40.  
  41.     unsigned char *array1, *array2;
  42.  
  43.     int *map;
  44.  
  45.     int i, j, k, l, landscape=FALSE, xinbytes, nbytes;
  46.  
  47.         FILE *fp1, *fp2;
  48.     
  49.  
  50.         if( argc != 3 && argc != 4 ){     /* Quit because argument count wrong */
  51.         printf("usage: pic2ps in.pic out.ps [-l landscape]\n");
  52.                 exit(1);
  53.         }
  54.  
  55.         
  56.         fp1=fopen( argv[1], "r");  /* Open the files as required by arguments */
  57.         if(fp1 == NULL){
  58.                 printf("File %s cannot be found\n",argv[1]);
  59.         printf("usage: pic2ps in.pic out.ps [-l landscape]\n");
  60.                 exit(1);
  61.         }
  62.  
  63.         fp2=fopen( argv[2], "w");  /* Open the files as required by arguments */
  64.         if(fp2 == NULL){
  65.                 printf("File %s cannot be found\n",argv[2]);
  66.         printf("usage: pic2ps in.pic out.ps [-l landscape]\n");
  67.                 exit(1);
  68.         }
  69.  
  70.     if ( argc == 4 && strcmp(argv[3], "-l") == 0 )
  71.         landscape = TRUE;
  72.  
  73.         fread(&signature, sizeof(signature), 1, fp1);
  74.     signature.count  = L2BW ( signature.count ); 
  75.  
  76.     for(i=0; i < signature.count; i++)
  77.             fread(&header, sizeof(header), 1, fp1);
  78.  
  79.     if( signature.count != 1 && signature.count != 2){
  80.         printf("Warning - Multiple bitmap per file are not supported\n");
  81.     }
  82.  
  83.     header.size[0] = L2BW ( header.size[0] );
  84.     header.size[1] = L2BW ( header.size[1] );
  85.  
  86.     printf("x %d y %d\n", header.size[0], header.size[1]);
  87.  
  88.     array1 = (unsigned char *) malloc( sizeof(char) * header.size[1] * header.size[0]/8 );
  89.     array2 = (unsigned char *) malloc( sizeof(char) * header.size[1] * header.size[0]/8 );
  90.     map    = (int *)           malloc( sizeof (int) * header.size[1] * header.size[0]   );
  91.  
  92.     nbytes = header.size[1] * header.size[0] / 8;
  93.  
  94.     fread(array1, nbytes, 1, fp1);
  95.  
  96.     if( signature.count == 2 )
  97.         fread(array2, nbytes, 1, fp1);
  98.  
  99.         fclose(fp1);
  100.  
  101.     xinbytes = header.size[0] / 8;
  102.  
  103.     for(j=0;j<header.size[1];j++){
  104.         for(i=0;i<xinbytes;i++){
  105.             l = 1;
  106.             for(k=0; k<8; k++){
  107.                 if( array1[j*xinbytes+i] & l ){
  108.                     map[(i*8+k)+header.size[0]*j]=0;
  109.                 }else{
  110.                     map[(i*8+k)+header.size[0]*j]=2;
  111.                 }
  112.                 if( signature.count == 2 ){
  113.                     if( array2[j*xinbytes+i] & l ){
  114.                         if(map[(i*8+k)+header.size[0]*j] != 0)
  115.                             map[(i*8+k)+header.size[0]*j]=1;
  116.                     }
  117.                 }
  118.                 l *= 2;
  119.             }
  120.         }
  121.     }
  122.  
  123.     fprintf(fp2, "%%!\n");
  124.     fprintf(fp2, "initgraphics\n");
  125.     fprintf(fp2, "40.000000 45.000000 {dup mul exch dup mul add 1 exch sub} setscreen\n");
  126.     fprintf(fp2, "/picstr %d string def\n", header.size[0] );
  127.     if(landscape){
  128.         fprintf(fp2, "90 rotate\n");
  129.         fprintf(fp2, "50 -200.000000 translate\n");
  130.         fprintf(fp2, "686.40 -228.80 scale\n");
  131.     } else {
  132.         fprintf(fp2, "20 730.000000 translate\n");
  133.         fprintf(fp2, "451.440009405 -150.480003420 scale\n");
  134.     }
  135.     fprintf(fp2, "%d %d 8\n", header.size[0],  header.size[1] );
  136.     fprintf(fp2, "[%d 0 0 %d 0 0]\n",header.size[0], header.size[1]);
  137.     fprintf(fp2, "{ currentfile\n");
  138.     fprintf(fp2, "picstr readhexstring pop}\n");
  139.     fprintf(fp2, "image\n");
  140.  
  141.  
  142.     for( j=0; j < header.size[1]; j++ ){
  143.         for(i=0; i < header.size[0]; i++){
  144.             if( map[i+header.size[0]*j] == 0 )
  145.                 fprintf(fp2, "00");
  146.             else if ( map[i+header.size[0]*j] == 1 )
  147.                 fprintf(fp2, "f0");
  148.             else 
  149.                 fprintf(fp2, "ff");
  150.         }
  151.         fprintf(fp2, "\n");
  152.     }
  153.     fprintf(fp2, "showpage\n");
  154.  
  155.         fclose(fp2);
  156.  
  157.     free(map);
  158.     free(array1);
  159.     free(array2);
  160. }
  161.